// 给定一个字符串，逐个翻转字符串中的每个单词。

 

// 示例 1：

// 输入: "the sky is blue"
// 输出: "blue is sky the"
// 示例 2：

// 输入: "  hello world!  "
// 输出: "world! hello"
// 解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
// 示例 3：

// 输入: "a good   example"
// 输出: "example good a"
// 解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 

// 说明：

// 无空格字符构成一个单词。
// 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
// 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 

// 进阶：

// 请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

#include <string>
#include <sstream>

using namespace std;

// 使用stringstream
class Solution1 {
public:
    string reverseWords(string s) {
        stringstream ss(s);
        string res{};
        string t{};
        ss >> res; // 把第一个单词先流入res
        while (ss >> t) {
            res = t + " " + res;
        }
        // if (!res.empty() && res[0] == ' ') res = "";
        return res;
    }
};

// 使用getline
class Solution2 {
public:
    string reverseWords(string s) {
        stringstream ss(s);
        string res{};
        string t{};
        while (getline(ss, t, ' ')) {
            if (t.empty()) continue;
            res = (res.empty() ? t : (t + " " + res)); // 判断是不是第一个单词
        }
        return res;
    }
};

